import store from '@/store'
import axios from 'axios'
import { Loading, Message } from 'element-ui'
import router from '@/router'
const baseURL = '/api'
const instance = axios.create({
  baseURL,
  timeout: 5000
})
let loadingInstance

// 不需要token的白名单路径
const whiteList = ['/user/login', '/user/register']

// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 发送请求之前显示loading
    loadingInstance = Loading.service({
      lock: true,
      text: '正在加载中...',
      spinner: 'el-icon-loading',
      background: 'rgba(0, 0, 0, 0.7)'
    })
    // 判断请求是否在白名单中
    const isWhiteList = whiteList.some(path => config.url.includes(path))
    // 如果不在白名单中，并且有token，就携带上token
    if (!isWhiteList) {
      const token = localStorage.getItem('token') || store.state.user.token
      if (token) {
        config.headers.authentication = token
      }
    }
    return config
  },
  error => {
    // 处理错误请求
    console.log(error)
    // 关闭loading
    if (loadingInstance) {
      loadingInstance.close()
    }
    return Promise.reject(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  response => {
    // 关闭loading
    if (loadingInstance) {
      loadingInstance.close()
    }
    // 处理响应数据
    const { data } = response
    // 返回的不是成功状态码，则给错误提示
    if (data.code !== 200) {
      Message.error(data.msg || '请求失败')
      // 如果是401，跳转到登录页面
      if (data.code === 401) {
        // token过期或无效，跳转到登录页面
        localStorage.removeItem('token')
        // 避免在登录页面重复导航
        if (router.currentRoute.path !== '/login') {
          router.push('/login').catch(err => {
            console.warn('路由导航被取消:', err.message)
          })
        }
        Message.error('登录已过期，请重新登录')
        return Promise.reject(new Error(data.msg || 'Error'))
      }
      return Promise.reject(new Error(data.msg || 'Error'))
    } else {
      // 响应成功则返回数据
      return data
    }
  },
  error => {
    // 关闭loading
    if (loadingInstance) {
      loadingInstance.close()
    }
    // 处理错误响应
    console.error('API请求错误:', error)
    // 区分不同类型的错误
    if (error.message.includes('Network Error')) {
      Message.error('网络连接错误，请检查后端服务器是否启动')
    } else if (error.message.includes('timeout')) {
      Message.error('请求超时，请稍后重试')
    } else {
      Message.error(error.message || '请求失败，请稍后再试')
    }
    return Promise.reject(error)
  }
)
export default instance
